<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
// 实现一个事件总线 EventBus, 包含事件监听，监听一次，解绑，触发。
// 事件名可以是任意的，同一事件可以绑定多次

class EventBus {
  constructor(){
      this.subs = Object.create(null)
  }
  // 绑定
  on(eventName, callback) {
      this.subs[eventName] = this.subs[eventName] || []
      this.subs[eventName].push(callback)
  }
   // 触发
  emit(eventName) {
    if(this.subs[eventName]){
        this.subs[eventName].forEach(handler => {
            handler()
        });
    }
  }
  // 绑定事件，同 on，但是通过 once 绑定的事件只能 emit 一次
  once(eventName, callback) {
    let me = this
    let wrapFunc = (...args) => {
        callback.apply(this, args);
        me.off(eventName, wrapFunc);
    }
    me.on(eventName, wrapFunc);
  }
  // 解绑
  off(eventName, callback) {
    this.subs[eventName].forEach((item,index)=>{
        if(item==callback){
            this.subs[eventName].splice(index,1)
        }
    })
  }
}


// eg:
const instance = new EventBus();
const fn1 = () => console.log('click1');
const fn2 = () => console.log('click2');

instance.on('click', fn1);
instance.on('click', fn2);
instance.emit('click'); // 输出 click1 click2
instance.off('click', fn2);
instance.emit('click'); // 输出 click1
instance.once('click', fn2);
instance.emit('click'); // 输出 click1 click2
instance.emit('click'); // 输出 click1 
instance.on('click', fn2);
instance.emit('click');


// 实现 Promise.allSettled 方法
// Promise.allSettled = (arr) => {
//     let result = []
//     arr.map((item)=>{
//         if(item instanceof this){
            
//         }else{
//             result.push(item)
//         }
//     })
// }

// eg:
// Promise.allSettled([
//   Promise.resolve(1),
//   Promise.reject(2),
// ]).then(res => {
//   console.log(res);
  // 输出如下：
  // [
  //   {
  //     status: 'fulfilled',
  //     value: 1,
  //   },
  //   {
  //     status: 'rejected',
  //     reason: 2,
  //   },
  // ]
// })
 
new Promise(resolve => {
    console.log(1);
    resolve(3);
    Promise.resolve().then(()=> console.log(4))
}).then(num => {
    console.log(num);
    setTimeout(()=>{console.log(6)},0);
});

console.log(2);


    </script>
</body>
</html>